#include "bsp_timer.h"
#include "bsp_led.h"
#include <math.h>

/***********************************************************************************************************
函数名称 ： TIM3_Int_Init
功    能 ： 通用定时器3中断初始化
参    数 ： f  - 需要设置定时器的频率值
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void TIM3_Int_Init(uint16_t f)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	// 计算最合适的分频和重装值----------------------------------------------
	uint32_t period,prescaler;
	float midFloat;
	long clkInt;
	long midInt;
	float clkFloat = 72000000.0f/f;
	if(clkFloat-(long)clkFloat>=0.5f)  		clkInt = clkFloat+1;
	else							 		clkInt = (long)clkFloat;
	
	midFloat = sqrt(clkFloat);// 开方
	if(midFloat-(long)midFloat>=0.5f)  		midInt = (long)midFloat+1;
	else									midInt = (long)midFloat;
	// 找一组最接近的
	for(int i=midInt;i>=1;i--)
	{
		if(clkInt%i==0)
		{
			prescaler = i;
			period = clkInt/i;
			break;
		}
	}
	// ----------------------------------------------------------------------
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = period-1;; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler = prescaler-1; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}




/***********************************************************************************************************
函数名称 ： TIM3_IRQHandler
功    能 ： 定时器3中断服务程序
参    数 ： f  - 需要设置定时器的频率值
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void TIM3_IRQHandler(void)   
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  		//清除TIMx更新中断标志 
		LED_Updata(ledStat);
	}
}


